package com.zzyl.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zzyl.base.PageResponse;
import com.zzyl.dto.NursingProjectDto;
import com.zzyl.entity.NursingProject;
import com.zzyl.enums.BasicEnum;
import com.zzyl.exception.BaseException;
import com.zzyl.mapper.NursingProjectMapper;
import com.zzyl.service.NursingProjectService;
import com.zzyl.utils.ObjectUtil;
import com.zzyl.vo.NursingProjectVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.prefs.BackingStoreException;

@Service
public class NursingProjectServiceImpl implements NursingProjectService {


    @Autowired
    private NursingProjectMapper nursingProjectMapper;

    /**
     * 分页条件查询护理项目
     * @param name
     * @param status
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public PageResponse selectByPage(String name, Integer status, Integer pageNum, Integer pageSize) {

        //设置分页
        PageHelper.startPage(pageNum,pageSize);
        Page<NursingProjectVo> nursingProjects = nursingProjectMapper.selectByPage(name, status);
        return PageResponse.of(nursingProjects,NursingProjectVo.class);
    }

    /**
     * 新增护理项目
     * @param nursingProjectDTO 护理项目数据传输对象
     */
    @Override
    public void add(NursingProjectDto nursingProjectDTO) {
        NursingProject nursingProject = new NursingProject();
        BeanUtils.copyProperties(nursingProjectDTO, nursingProject);
        nursingProjectMapper.insert(nursingProject);
    }

    /**
     * 根据ID查询护理项目
     * @param id
     * @return
     */
    @Override
    public NursingProjectVo getById(Long id) {
        NursingProject nursingProject = nursingProjectMapper.findById(id);
        return BeanUtil.toBean(nursingProject,NursingProjectVo.class);
    }

    /**
     * 更新护理项目信息
     *
     * @param nursingProjectDTO 护理项目数据传输对象
     */
    @Override
    public void update(NursingProjectDto nursingProjectDTO) {
        NursingProject nursingProject = new NursingProject();
        BeanUtils.copyProperties(nursingProjectDTO, nursingProject);
        nursingProjectMapper.update(nursingProject);
    }

    /**
     * 根据项目ID删除护理项目。
     *
     * 本方法通过调用nursingProjectMapper的.deleteById方法，传入项目ID来删除对应的护理项目。
     * 删除操作是基于数据库的，因此需要注意对数据的备份和操作的谨慎性。
     *
     * @param id 护理项目的唯一标识ID，用于定位并删除特定的护理项目。
     */
    @Override
    public void deleteById(Long id) {
        NursingProject nursingProject = nursingProjectMapper.findById(id);
        if (ObjectUtil.isNotEmpty(nursingProject)&& nursingProject.getStatus().equals(1)){
            throw new BaseException(BasicEnum.ENABLED_CANNOT_DELETED);
        }
        nursingProjectMapper.deleteById(id);
    }

    /**
     * 检查项目是否启用。
     * 通过调用nursingProjectMapper的isEnable方法，根据项目ID和状态检查项目是否被启用。
     * 此方法用于业务逻辑中对项目启用状态的查询，不直接返回结果，而是通过Mapper操作数据库进行。
     *
     * @param id 项目ID，用于唯一标识一个项目。
     * @param status 项目的状态码，用于判断项目当前的状态。
     */
    @Override
    public void isEnable(Long id, Integer status) {
        nursingProjectMapper.isEnable(id,status);
    }

    /**
     * 查询所有护理项目的信息
     *
     * 本方法通过调用nursingProjectMapper的selectAll方法，来获取数据库中所有的护理项目信息。
     * 它不接受任何参数，返回一个包含所有护理项目信息的List。
     *
     * @return List<NursingProjectVo> 返回一个护理项目信息的列表
     */
    @Override
    public List<NursingProjectVo> selectAll() {
        return nursingProjectMapper.selectAll();
    }
}
